#include "mainwidget.h"
#include "addfrienddialog.h"
#include "groupsessiondetailwidget.h"
#include "selfinfowidget.h"
#include "./ui_mainwidget.h"
#include "model/datacenter.h"
#include "sessionfriendarea.h"
#include "sessiondetailwidget.h"
#include "model/data.h"
#include "toast.h"
#include "debug.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QWidget>
#include <QLineEdit>

using namespace model;

MainWidget* MainWidget::instance = nullptr;
MainWidget* MainWidget::getInstance()
{
    if(instance == nullptr)
    {
        //不传入为参数 以桌面为父窗口
        //整个程序的主窗口 符合设定
        instance = new MainWidget();
    }
    return instance;
}
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    this->setWindowTitle("Xhat");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));
    //初始化主窗口的样式布局
    initMainWindow();
    //初始化左侧窗口布局
    initLeftWindow();
    //初始化中间窗口布局
    initMidWindow();
    //初始化右侧窗口布局
    initRightWindow();
    //初始化信号槽
    initSignalSlot();
    //初始化websocket
    initWebsocket();
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::initMainWindow()
{
    QHBoxLayout* layout = new QHBoxLayout();
    //让内部元素紧挨着
    layout->setSpacing(0);
    //让页边距为0
    layout->setContentsMargins(0, 0, 0, 0);
    this->setLayout(layout);

    windowLeft = new QWidget();
    windowMid = new QWidget();
    windowRight = new QWidget();

    windowLeft->setFixedWidth(70);
    windowMid->setFixedWidth(310);
    windowRight->setMinimumWidth(800);

    windowLeft->setStyleSheet("QWidget { background-color: rgb(46, 46, 46); }");
    windowMid->setStyleSheet("QWidget { background-color: rgb(247, 247, 247); }");
    windowRight->setStyleSheet("QWidget { background-color: rgb(245, 245, 245); }");

    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);


}

void MainWidget::initLeftWindow()
{
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(20);
    layout->setContentsMargins(0, 30, 0, 0); // 顺时针 左上右下
    windowLeft->setLayout(layout);

    //添加用户头像
    userAvatar = new QPushButton();
    userAvatar->setFixedSize(45, 45); //按钮尺寸
    userAvatar->setIconSize(QSize(30, 30)); //按钮中图片尺寸
    //userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    userAvatar->setStyleSheet("QPushButton { background-color: transparent; border: none; outline: none; }");
    layout->addWidget(userAvatar, 1, Qt::AlignTop | Qt::AlignHCenter); //水平居中垂直靠上

    //添加会话标签页按钮
    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFixedSize(45, 45); //按钮尺寸
    sessionTabBtn->setIconSize(QSize(30, 30)); //按钮中图片尺寸
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    sessionTabBtn->setStyleSheet("QPushButton { background-color: transparent; border: none; outline: none; }");
    layout->addWidget(sessionTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);

    //添加好友标签页按钮
    friendTabBtn = new QPushButton();
    friendTabBtn->setFixedSize(45, 45); //按钮尺寸
    friendTabBtn->setIconSize(QSize(30, 30)); //按钮中图片尺寸
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTabBtn->setStyleSheet("QPushButton { background-color: transparent; border: none; outline: none; }");
    layout->addWidget(friendTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);

    //添加好友申请标签页按钮
    applyTabBtn = new QPushButton();
    applyTabBtn->setFixedSize(45, 45); //按钮尺寸
    applyTabBtn->setIconSize(QSize(30, 30)); //按钮中图片尺寸
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTabBtn->setStyleSheet("QPushButton { background-color: transparent; border: none; outline: none; }");
    layout->addWidget(applyTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);

    layout->addStretch(20); //下面加个空白区域

}

void MainWidget::initMidWindow()
{
    QGridLayout* layout = new QGridLayout();
    //距离上方20间距 其余不要
    layout->setContentsMargins(0, 20, 0, 0);
    layout->setHorizontalSpacing(0);
    layout->setVerticalSpacing(10);
    windowMid->setLayout(layout);

    searchEdit = new QLineEdit();
    searchEdit->setFixedHeight(30);
    searchEdit->setPlaceholderText("搜索");     //默认栏
    searchEdit->setStyleSheet("QLineEdit { border-radius: 5px; background-color: rgb(226, 226, 226); padding-left: 5px ;}");

    addFriendBtn = new QPushButton();
    addFriendBtn->setFixedSize(30, 30);
    addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
    QString style = "QPushButton { border-radius: 5px; background-color: rgb(226, 226, 226); }";
    style += " QPushButton:pressed {background-color: rgb(240, 240, 240); }";
    addFriendBtn->setStyleSheet(style);

    sessionfriendarea = new SessionFriendArea();

    //创建空白的 widget 到布局管理器里
    QWidget* space1 = new QWidget();
    space1->setFixedWidth(10);
    QWidget* space2 = new QWidget();
    space2->setFixedWidth(10);
    QWidget* space3 = new QWidget();
    space3->setFixedWidth(10);

    layout->addWidget(space1, 0, 0);
    layout->addWidget(searchEdit, 0, 1);
    layout->addWidget(space2, 0, 2);
    layout->addWidget(addFriendBtn, 0, 3);
    layout->addWidget(space3, 0, 4);
    layout->addWidget(sessionfriendarea, 1, 0, 1, 5);
}

void MainWidget::initRightWindow()
{
    //创建右侧窗口的布局管理器
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(0);
    layout->setAlignment(Qt::AlignTop);
    layout->setContentsMargins(0, 0, 0, 0);
    windowRight->setLayout(layout);

    //创建上方标题栏
    QWidget* titleWidget = new QWidget();
    titleWidget->setFixedHeight(62);
    titleWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    layout->addWidget(titleWidget);

    //给标题栏 添加label 和 一个 按钮
    QHBoxLayout* hlayout = new QHBoxLayout();
    hlayout->setSpacing(0);
    //使标题和按钮 左右两侧有间距
    hlayout->setContentsMargins(10, 0, 10, 0);
    titleWidget->setLayout(hlayout);
    titleWidget->setObjectName("titleWidget");
    titleWidget->setStyleSheet("#titleWidget {border-bottom: 1px solid rgb(230, 230, 230); border-left: 1px solid rgb(230, 230, 230);}");
    sessionTitleLabel = new QLabel();
    sessionTitleLabel->setStyleSheet("QLabel {font-size: 22px; border-bottom: 1px solid rgb(230, 230, 230);}");

#if TEST_UI
    sessionTitleLabel->setText("这是会话标题");
#endif
    hlayout->addWidget(sessionTitleLabel);

    extraBtn = new QPushButton();
    extraBtn->setFixedSize(30, 30);
    extraBtn->setIconSize(QSize(30, 30));
    extraBtn->setIcon(QIcon(":/resource/image/more.png"));
    extraBtn->setStyleSheet("QPushButton {border:none; background-color: rgb(245, 245, 245);} QPushButton:pressed {background-color: rgb(220, 220, 220); }");
    hlayout->addWidget(extraBtn);

    //4.添加消息展示区
    messageShowArea = new MessageShowArea();
    layout->addWidget(messageShowArea);

    //5.添加消息编辑区
    messageEditArea = new MessageEditArea();
    //确保消息编辑区 位于下方
    layout->addWidget(messageEditArea, 0, Qt::AlignBottom);
}

void MainWidget::initSignalSlot()
{
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    //////////////////////////////////////
    ///连接信号槽 处理标签页按钮切换问题
    //////////////////////////////////////
    connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::swichTabToSession);
    connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::swichTabToFriend);
    connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::swichTabToApply);

    ///////////////////////////////////////
    ///点击自己头像 弹出对话框显示个人主页
    ///////////////////////////////////////
    connect(userAvatar, &QPushButton::clicked, this, [=](){
        SelfInfoWidget* selfinfowidget = new SelfInfoWidget(this);
        selfinfowidget->exec(); //弹出模态对话框 不能进行其余页面操作
        //selfinfowidget->show(); //弹出非模态对话框 能进行其余页面操作
    });

    //////////////////////////////////////////
    ///点击会话详情按钮 弹出会话详情窗口
    //////////////////////////////////////////
    connect(extraBtn, &QPushButton::clicked, this, [=]()
    {
// #if TEST_GROUP_SESSION_DETAIL
//         bool isSingleChat = false;
// #else
//         bool isSingleChat = true;
// #endif

        //判断单聊还是群聊 先取到会话详细信息 再通过uerId判断
        QString currentChatSessionId = dataCenter->getCurrentChatSessionId();
        ChatSessionInfo* chatSessionInfo = dataCenter->findSessionById(currentChatSessionId);
        if(chatSessionInfo == nullptr)
        {
            LOG() << "会话详情 弹出窗口时 发现当前会话不存在!";
            return;
        }
        bool isSingleChat = (chatSessionInfo->userID != "");
        if(isSingleChat)
        {
            //单聊
            UserInfo* userInfo = dataCenter->findFriendById(chatSessionInfo->userID);
            if(userInfo == nullptr)
            {
                LOG() << "会话详情 弹出窗口时 发现当前单聊好友不存在!";
                return;
            }
            SessionDetailWidget* sessionDetailWidget = new SessionDetailWidget(this, *userInfo);
            sessionDetailWidget->exec(); //弹出模态对话框 不能进行其余页面操作
            return;
        }
        else
        {
            //群聊
            GroupSessionDetailWidget* groupSessionDetailWidget = new GroupSessionDetailWidget(this);
            groupSessionDetailWidget->exec(); //弹出模态对话框 不能进行其余页面操作
            return;
        }

    });
    //////////////////////////////////////////
    ///点击添加好友按钮 弹出添加好友窗口
    //////////////////////////////////////////
    connect(addFriendBtn, &QPushButton::clicked, this, [=]()
    {
        AddFriendDialog* addfrienddialog = new AddFriendDialog(this);
        addfrienddialog->exec(); //弹出模态对话框 不能进行其余页面操作

    });
    //////////////////////////////////////////
    /// 修改搜索框内容 弹出添加好友对话框
    //////////////////////////////////////////
    connect(searchEdit, &QLineEdit::returnPressed, this, [=]()
    {
        const QString& text = searchEdit->text();
        AddFriendDialog* addfrienddialog = new AddFriendDialog(this);
        addfrienddialog->setSearchKey(text);
        //清空主窗口文本
        searchEdit->setText("");
        addfrienddialog->exec(); //弹出模态对话框 不能进行其余页面操作 阻塞函数
    });
    //////////////////////////////////////////
    /// 获取个人信息
    //////////////////////////////////////////
    // 提供一个具体方法 通过网络获取个人信息
    connect(dataCenter, &DataCenter::getMyselfDone, this, [=]()
    {
        //从 DataCenter 拿到响应结果myself 把里面的头像取出来 放到界面上
        //获取个人信息完成后的处理
        UserInfo* myself = dataCenter->getMyself();
        if(myself != nullptr && !myself->avatar.isNull())
        {
            //设置头像
            //debug

            userAvatar->setIcon(myself->avatar);
            // QIcon icon = userAvatar->icon();
            // //判断两个icon是否一致
            // if(icon.cacheKey() == myself->avatar.cacheKey())
            // {
            //     LOG() << "头像设置成功!";
            // }
            // else
            // {
            //     LOG() << "头像设置失败!";
            // }

        }
    });
    dataCenter->getMyselfAsync();
    //////////////////////////////////////////
    /// 获取好友列表
    //////////////////////////////////////////
    loadFriendList();

    //////////////////////////////////////////
    /// 获取会话列表
    //////////////////////////////////////////
    loadSessionList();

    //////////////////////////////////////////
    /// 获取好友申请列表
    //////////////////////////////////////////
    loadApplyList();

    //////////////////////////////////////////
    /// 处理修改头像
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::changeAvatarDone, this, [=]()
    {
        //修改头像完成后的处理
        UserInfo* myself = dataCenter->getMyself();
        if(myself != nullptr && !myself->avatar.isNull())
        {
            //设置头像
            userAvatar->setIcon(myself->avatar);
        }
    });
    //////////////////////////////////////////
    /// 处理删除好友
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::deleteFriendDone, this, [=]()
    {
        //删除好友完成后的处理
        updateFriendList();
        updateChatSessionList();
        LOG() << "删除好友完成 ";

    });
    //////////////////////////////////////////
    /// 处理删除好友后可能的会话界面更新
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::clearCurrentChatSession, this, [=]()
    {
        //清空标题
        sessionTitleLabel->setText("");
        //清空消息展示区
        messageShowArea->clear();
        //清空当前聊天会话id
        dataCenter->setCurrentChatSessionId("");
        LOG() << "清空当前聊天会话界面 ";
    });
    //////////////////////////////////////////
    /// 处理添加好友申请 因为很多地方都能发送添加好友申请 所以放在主窗口
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::addFriendApplyDone, this, [=]()
    {
        Toast::showMessage("好友申请已发送");
    });
    //////////////////////////////////////////
    /// 处理推送来的好友申请通知
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::receiveFriendApplyDone, this, [=]()
    {
        //收到好友申请通知后的处理
        updateFriendApplyList();
        Toast::showMessage("收到新的好友申请", 3000);
    });
    //////////////////////////////////////////
    /// 处理同意好友申请
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::acceptFriendApplyDone, this, [=]()
    {
        //同意好友申请完成后的处理
        updateFriendList();
        //updateChatSessionList(); 可以不用调用 因为同意的时候绝对不是在会话区域
        updateFriendApplyList();
        Toast::showMessage("已添加为好友");
    });
    //////////////////////////////////////////
    /// 处理好友申请结果的数据
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::receiveFriendProcessDone, this, [=](const QString& nickName, bool isAccepted)
    {
        //收到好友申请处理结果通知后的处理
        if(isAccepted)
        {
            updateFriendList();
            Toast::showMessage(nickName + "已同意你的好友申请");
        }
        else
        {
            Toast::showMessage(nickName + "已拒绝你的好友申请");
        }
    });
    //////////////////////////////////////////
    /// 处理拒绝好友申请
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::rejectFriendApplyDone, this, [=]()
    {
        //拒绝好友申请完成后的处理
        updateFriendApplyList();
        Toast::showMessage("已拒绝好友申请");
    });
    //////////////////////////////////////////
    /// 处理创建群聊完成
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::createGroupChatSessionDone, this, [=]()
    {
        Toast::showMessage("创建群聊请求已发送");
    });
    //////////////////////////////////////////
    /// 处理创建群聊的会话数据
    //////////////////////////////////////////
    connect(dataCenter, &DataCenter::receiveCreateGroupChatSessionDone, this, [=](const QString& newChatSessionName)
    {
        updateChatSessionList();
        if(newChatSessionName.isEmpty() || newChatSessionName == "")
        {
            Toast::showMessage("你已被添加到新的群聊");
            return;
        }
    });
}

void MainWidget::initWebsocket()
{
    DataCenter* dataCenter = DataCenter::getInstance();
    dataCenter->initWebsocketConnection();
}
void MainWidget::swichTabToSession()
{
    //1.记录当前切换到了哪个标签页
    activeTab = SESSION_LIST;
    //2.调整图标显示情况 把会话按钮图标设为 active 另外两个图标设为 inactive
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    //3.在主窗口的中间部分 加载出会话列表
    this->loadSessionList();
}

void MainWidget::swichTabToFriend()
{
    //1.记录当前切换到了哪个标签页
    activeTab = FRIEND_LIST;
    //2.调整图标显示情况 把会话按钮图标设为 active 另外两个图标设为 inactive
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    //3.在主窗口的中间部分 加载出会话列表
    this->loadFriendList();
}

void MainWidget::swichTabToApply()
{
    //1.记录当前切换到了哪个标签页
    activeTab = APPLY_LIST;
    //2.调整图标显示情况 把会话按钮图标设为 active 另外两个图标设为 inactive
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));
    //3.在主窗口的中间部分 加载出会话列表
    this->loadApplyList();
}

void MainWidget::loadSessionList()
{
    // 从 DataCenter 获取会话列表数据, 然后显示在中间窗口
    // 先检查 DataCenter 是否有会话列表数据 如果有就直接显示 如果没有就发起网络请求获取会话列表数据
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<ChatSessionInfo>* sessionList = dataCenter->getChatSessionList();
    if(sessionList != nullptr)
    {
        //有数据 直接显
        updateChatSessionList();
        return;
    }
    //设置getdone槽函数
    LOG() << "loadSessionList: 会话列表数据为空 发起网络请求获取!";
    connect(dataCenter, &DataCenter::getChatSessionListDone, this, &MainWidget::updateChatSessionList, Qt::UniqueConnection);
    //没有数据 发起网络请求获取会话列表数据
    dataCenter->getChatSessionListAsync();
}

void MainWidget::loadFriendList()
{
    // 从 DataCenter 获取好友列表数据, 然后显示在中间窗口
    // 先检查 DataCenter 是否有好友列表数据 如果有就直接显示 如果没有就发起网络请求获取好友列表数据
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<UserInfo>* friendList = dataCenter->getFriendList();
    if(friendList != nullptr)
    {
        //有数据 直接显示
        updateFriendList();
        return;
    }
    //设置getdone槽函数
    LOG() << "loadFriendList: 好友列表数据为空 发起网络请求获取!";
    connect(dataCenter, &DataCenter::getFriendListDone, this, &MainWidget::updateFriendList, Qt::UniqueConnection);
    //没有数据 发起网络请求获取好友列表数据
    dataCenter->getFriendListAsync();
}

void MainWidget::loadApplyList()
{
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<UserInfo>* applyList = dataCenter->getFriendApplyList();
    if(applyList != nullptr)
    {
        updateFriendApplyList();
        return;
    }
    //设置getdone槽函数
    LOG() << "loadApplyList: 好友申请列表数据为空 发起网络请求获取!";
    connect(dataCenter, &DataCenter::getFriendApplyListDone, this, &MainWidget::updateFriendApplyList, Qt::UniqueConnection);
    //没有数据 发起网络请求获取好友申请列表数据
    dataCenter->getFriendApplyListAsync();
}

void MainWidget::updateFriendList()
{
    if(activeTab != FRIEND_LIST)
    {
        //当前不在好友标签页 不需要更新好友列表
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<UserInfo>* friendList = dataCenter->getFriendList();
    if(friendList == nullptr)
    {
        //debug
        LOG() << "好友列表数据为空 无法更新好友列表!";
        return;
    }
    //清空之前界面上的数据
    sessionfriendarea->clear();
    //遍历好友列表 添加到界面上
    for(const UserInfo& friendInfo : *friendList)
    {
        sessionfriendarea->addItem(FriendItemType,
                                    friendInfo.userID,
                                    friendInfo.avatar,
                                    friendInfo.nickname,
                                    friendInfo.description);
    }
}
// 更新会话列表
void MainWidget::updateChatSessionList()
{
    if(activeTab != SESSION_LIST)
    {
        //当前不在会话标签页 不需要更新会话列表
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<ChatSessionInfo>* sessionList = dataCenter->getChatSessionList();
    if(sessionList == nullptr)
    {
        //debug
        LOG() << "会话列表数据为空 无法更新会话列表!";
        return;
    }
    //清空之前界面上的数据
    sessionfriendarea->clear();
    //遍历会话列表 添加到界面上
    for(const ChatSessionInfo& sessionInfo : *sessionList)
    {
        //
        // 如果刚加上好友 从来没说过话
        if(sessionInfo.lastMessage.messageID == "")
        {
            //单聊
            if(sessionInfo.userID != "")
            {
                sessionfriendarea->addItem(SessionItemType,
                                           sessionInfo.chatSessionID,
                                           sessionInfo.avatar,
                                           sessionInfo.chatSessionName,
                                           "你们已经是好友了 现在开始聊天吧");
            }
            else    //群聊
            {
                sessionfriendarea->addItem(SessionItemType,
                                           sessionInfo.chatSessionID,
                                           sessionInfo.avatar,
                                           sessionInfo.chatSessionName,
                                           "你们已经是群U了 现在开始聊天吧");
            }
            continue;
        }
        //针对消息类型做判断
        if(sessionInfo.lastMessage.messageType == TEXT_TYPE)
        {
            sessionfriendarea->addItem(SessionItemType,
                                       sessionInfo.chatSessionID,
                                       sessionInfo.avatar,
                                       sessionInfo.chatSessionName,
                                       sessionInfo.lastMessage.content);
        }
        else if(sessionInfo.lastMessage.messageType == IMAGE_TYPE)
        {
            sessionfriendarea->addItem(SessionItemType,
                                       sessionInfo.chatSessionID,
                                       sessionInfo.avatar,
                                       sessionInfo.chatSessionName,
                                       "[图片]");
            continue;
        }
        else if(sessionInfo.lastMessage.messageType == FILE_TYPE)
        {
            sessionfriendarea->addItem(SessionItemType,
                                       sessionInfo.chatSessionID,
                                       sessionInfo.avatar,
                                       sessionInfo.chatSessionName,
                                       "[文件]");
            continue;
        }
        else if(sessionInfo.lastMessage.messageType == SPEECH_TYPE)
        {
            sessionfriendarea->addItem(SessionItemType,
                                       sessionInfo.chatSessionID,
                                       sessionInfo.avatar,
                                       sessionInfo.chatSessionName,
                                       "[语音]");
            continue;
        }
        else
        {
            //error 类型
            LOG() << "未知的消息类型 无法显示最后一条消息!" << sessionInfo.lastMessage.messageType;
        }

    }
}

void MainWidget::updateFriendApplyList()
{
    if(activeTab != APPLY_LIST)
    {
        //当前不在好友申请标签页 不需要更新好友申请列表
        return;
    }
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<UserInfo>* applyList = dataCenter->getFriendApplyList();
    if(applyList == nullptr)
    {
        //debug
        LOG() << "好友申请列表数据为空 无法更新好友申请列表!";
        return;
    }
    //清空之前界面上的数据
    sessionfriendarea->clear();
    //遍历好友申请列表 添加到界面上
    for(const UserInfo& applyInfo : *applyList)
    {
        sessionfriendarea->addItem(ApplyItemType,
                                    applyInfo.userID,
                                    applyInfo.avatar,
                                    applyInfo.nickname,
                                    "");
    }
}

void MainWidget::loadRecentMessage(const QString &chatSessionId)
{
    //先判断dataCenter中是否有recentMessages
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<Message>* recentMessages = dataCenter->getRecentMessage(chatSessionId);
    if(recentMessages != nullptr)
    {
        //有数据 直接显示
        LOG() << "直接显示最近消息数据 chatSessionId: " << chatSessionId;
        updateRecentMessage(chatSessionId);
        return;
    }
    //没有数据 发起网络请求获取最近消息数据
    connect(dataCenter, &DataCenter::getRecentMessageDone, this, &MainWidget::updateRecentMessage, Qt::UniqueConnection);
    dataCenter->getRecentMessageAsync(chatSessionId, true);
}

void MainWidget::updateRecentMessage(const QString &chatSessionId)
{
    //1.从dataCenter获取最近消息列表
    model::DataCenter* dataCenter = model::DataCenter::getInstance();
    QList<Message>* recentMessages = dataCenter->getRecentMessage(chatSessionId);

    //2.清空消息展示区
    messageShowArea->clear();
    //3.遍历最近消息列表 添加到消息展示区
    //这里使用头插 越晚的消息在前
    if(recentMessages == nullptr)
    {
        //debug
        LOG() << "error recentMessages为空 无法更新最近消息!";
        return;
    }
    for(int i = recentMessages->size()- 1; i >= 0; --i)
    {
        const Message& message = recentMessages->at(i);
        //判断是否是自己发的消息 来确定isLeft
        bool isLeft = message.sender.userID != dataCenter->getMyself()->userID;
        //添加到messageShowArea
        messageShowArea->addFontMessage(isLeft, message);
    }
    //4. 设置会话标题
    ChatSessionInfo* sessionInfo = dataCenter->findSessionById(chatSessionId);
    if(sessionInfo != nullptr)
    {
        sessionTitleLabel->setText(sessionInfo->chatSessionName);
    }
    //5. 保存当前会话id
    dataCenter->setCurrentChatSessionId(chatSessionId);
    //6.把滚动条自动滚到末尾
    messageShowArea->scrollToEnd();

}

void MainWidget::switchChatSession(const QString &userId)
{
    //1.在会话列表中 先找到对应的会话元素
    DataCenter* dataCenter = DataCenter::getInstance();
    ChatSessionInfo* chatSessionInfo = dataCenter->findSessionByUserId(userId);
    if(chatSessionInfo == nullptr)
    {
        LOG() << "error 未找到对应的会话 userId=" << userId;
        return;
    }
    //2.把选中的会话顶置
    dataCenter->topChatSessionInfo(*chatSessionInfo);

    //3.切换到会话列表标签页
    swichTabToSession();
    //4.加载这个会话对应的历史信息
    sessionfriendarea->clickItem(0);
}

MessageShowArea *MainWidget::getMessageShowAreaWidget() const
{
    return messageShowArea;
}



